#include <stdio.h>
#include <cstdlib>


/*此处是顺序队列数据结构定义*/
typedef int DataType;
struct seqQueue//请完成数据结构定义
{
        int MAXNUM;//用于记录顺序队列中能存放的最大元素个数，整型
        int front,rear;//用于存放顺序队列的队首，队尾
        DataType *element;//用于存放数据元素的连续空间的起始地址
};

typedef struct seqQueue *PseqQueue;
//第一关 test
PseqQueue createNullQueue_seq(int m)
{//此处填写代码，创建一个空的顺序队列，能存放的最大元素个数为 m
    //若m=0，则返回NULL
    if(m==0)
        return 0;
    PseqQueue L;
    L=(PseqQueue)malloc(sizeof(PseqQueue*));
    L->MAXNUM=m;
    L->element=(DataType*)malloc(sizeof(DataType)*m);
    L->rear=0;
    L->front=0;
    return L;
}

//第二关
int isNullQueue_seq(PseqQueue Q)
{
    //判断顺序（环形）队列是否为空，若为空，返回值为1，否则返回值为0,若队列不存在，则返回-1
 if(Q==NULL)
     return -1;
 return Q->rear==Q->front;
}


//第三关
int isFullQueue_seq(PseqQueue Q)
{
    //判断环形队列是否已满，若已满，返回值为1，否则返回值为0
    return Q->rear==Q->front;
}


//第四关
int enQueue_seq(PseqQueue Q ,DataType x)
{//在环形队列中插入数据元素x，若插入不成功，返回0；插入成功返回值为1
    if(Q->rear==Q->MAXNUM-1)
        return 0;
    Q->element[Q->rear]=x;
    Q->rear++;
    return 1;

}



//第五关
DataType delQueue_seq(PseqQueue Q)
{//出队并返回删除元素，若队列为空，则返回-1
    int i;
    if(Q->front==Q->rear)
        return -1;
    i=Q->element[Q->front];
    Q->front++;
    return i;
}

//第六关
DataType front_seq(PseqQueue Q)
{// 取队首元素返回，若队列为空，则返回-1
    if(Q->rear==0||Q->front==Q->rear)
        return -1;
    return Q->element[Q->front];
}

//销毁顺序队列，释放队列所占存储空间
int destroyQueue_seq(PseqQueue Q)
{
    //返回值为销毁的栈中现有数据元素的个数，若待销毁的线性表不存在，则返回0
    int i;
    if(Q==NULL)
        return 0;
    for(i=0;Q->front!=Q->rear;i++)
    {
        Q->front++;
    }
    free(Q);
    return i;
}


//第七关
void queueApp(int a[],int n)
{
//参数用于传递顾客编号和顾客人数，输出顾客接受服务后离开顺序
    PseqQueue L;
    L=createNullQueue_seq(n+1);//创建一个列表
    int q[100],w[100];//创建两个数组存放奇数和偶数
    int j=0,k=0;
    for(int i=0;i<n;i++)//将奇数存放在w数组里，偶数存放在q数组里，k奇数，j是偶数
    {
        if(a[i]%2==0)
        {q[j]=a[i];j++;}
        else if(a[i]%2==1)
        {w[k]=a[i];k++;}
    }
    int y=0,p=0,s=0;//y偶数，p奇数，s输入几个奇数
    for (int i=0;i<=n;i++)
    {
        if (k!=0)
        {
        if (s==2&&y!=j)
        {
            enQueue_seq(L,q[y]);
            y++;
            s=0;
        }
        else if(s<2&&p!=k)//输入奇数
        {
            enQueue_seq(L,w[p]);
            p++;
            s++;
        }
    }
        else
        {enQueue_seq(L,q[y]);y++;}
    }

    printf("1");
    for (int i=0;i<n;i++)
    {
        printf("%d ",delQueue_seq(L));
    }
}









